Many types of computing environments, including general purpose computers and data processing systems, employ storage organized using a “virtual memory” scheme. A general virtual memory allows applications and/or processes that are executing in a computing environment to behave as if they have an unlimited amount of memory at their disposal. In actuality, the amount of storage available to a particular application or process is limited by the amount of storage in the computing environment and further limited by the number of concurrently executing programs sharing that storage. In addition, a virtual memory scheme hides the actual physical address of memory from the application programs. Application programs access their memory space using a logical address, which is then converted to a physical address by the computing environment.
A virtual memory system organizes storage in units called “blocks” (or “pages”). These blocks are moved between a fast, primary memory and one or more larger and usually slower secondary, tertiary, etc. storage units. The movement of blocks (often called swapping) is transparent to the applications or processes that are executed in the computing environment, enabling the applications or processes to behave as if they each have an unlimited amount of storage.
Certain conventional systems occasionally need to copy portions of memory. This copying can either be user-initiated or initiated by an operating system. Conventional systems often use a “lazy” copy method for a “flash copy” in which the storage to be copied is assigned a status of read-only, but the actual copy is deferred until later. If an attempt is made to write into either the original or the copy, then the memory is copied at that time and both the original and the copy are given an input/output (I/O) status of read-write. In this way, it appears that a copy was made immediately, but the actual copying is deferred until the last possible time. If no write is performed, no copying occurs. For this reason, this method is called “copy-on-write” or “virtual copy.”
Generally, a copy-on-write operation is computationally expensive because a single write results in two write operations. That is, an existing data block needs to be copied from an old physical block to a new physical block, and then the actual update/write operation is performed on the new physical block. In view of this computational overhead, there is a need in the art for a novel copy-on-write implementation which, in part, eliminates the dual write requirement.